#include<iostream>
using namespace std;
//class A
//
//{
//
//public:
//
//    A() :m_iVal(0) { test(); }
//
//    virtual void func() { std::cout << m_iVal <<endl; }
//
//    void test() { func(); }
//
//public:
//
//    int m_iVal;
//
//};
//
//
//
//class B : public A
//
//{
//
//public:
//
//    B() { test(); }
//
//    virtual void func()
//
//    {
//
//        ++m_iVal;
//
//        std::cout << m_iVal << endl;
//
//    }
//
//};
//
//class C
//{
//    virtual void func1()
//    {
//        cout << "c::func1()" << endl;
//    }
//
//};
//
// class D
// {
//     virtual void func2()
//     {
//         cout << "d::func2()" << endl;
//     }
// };
//
// class E:public C,public D
// {
//     void func1()override
//     {
//         cout << "E::func1()" << endl;
//     }
//
//     void func2()override
//     {
//         cout << "E::func2()" << endl;
//     }
//
//     virtual void func3()
//     {
//         cout << "E::func3()" << endl;
//     }
//     
//
//    
// };
//
//
// typedef void(*FUNC)();
//
// void PrintVTF(FUNC* table)
// {
//     for (int i = 0; table[i] != nullptr; i++)
//     {
//         printf("%d::%p\n", i, table[i]);
//         table[i]();
//     }
// }

class A

{

public:
    int x = 3;

    virtual void f()

    {

        cout << "A::f()" << endl;

    }

};



class B : public A

{

private:

    virtual void f()

    {

        cout << "B::f()" << endl;

    }

};


int main(int argc, char* argv[])

{

 /*   A* p = new B;

    p->test();*/

   /* C c;
    D d;
    E e;
    int k = *((int*)&e);
    D* x =&e;
    PrintVTF((FUNC*)k);
    k = *((int*)x);
    PrintVTF((FUNC*)k);*/
    //A* pa = (A*)new B;
    B* x = new B;
    A* temp = x;
    A* kk = new A;
    A* pa = temp;
    pa->f();


    return 0;

}